home *** CD-ROM | disk | FTP | other *** search
/ PC-SIG: Essential Home & Business / PC-SIG - Essential Home and Business Collection.iso / 24 / 4 / 1 / DISK2441.ZIP / LISTICO / LISTICO.C next >
Text File  |  1990-08-24  |  13KB  |  437 lines

  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2.  *          Filename : LISTICO.C                                           *
  3.  *         Version : 1.0                                                 *
  4.  *         Project : Windows 3.0 Icons                                   *
  5.  *          Author : Philippe Rabergeau                                  *
  6.  *       Copyright : (C) 1990 by Philippe Rabergeau                      *
  7.  *          Compiler : Borland Turbo C Version 2.0                *
  8.  *     Creation date : 07/18/90                                            *
  9.  * Modification date : 08/24/90                                            *
  10.  *     Description : List Windows 3.0 icons                              *
  11.  *          Comments : Not for Commercial Use                              *
  12.  *                                          *
  13.  * Please inform the author of any development in association           *
  14.  * with this source code. You are authorized to use this source code       *
  15.  * ONLY if you send me your collection of original WINDOWS 3.0 icons!      *
  16.  *                                                                         *
  17.  *=========================================================================*
  18.  * WARNING: Memory model must be LARGE                                     *
  19.  *=========================================================================*
  20.  * This source code is not very clean, if I received a lot of support      *
  21.  * I promise to clean up the code and add more stuff.                 *
  22.  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include <ctype.h>
  28. #include <conio.h>
  29. #include <dir.h>
  30. #include <mem.h>
  31. #include <dos.h>
  32. #include <io.h>
  33. #include <fcntl.h>
  34. #include <sys\stat.h>
  35.  
  36. #define        ICON_MAX    2048
  37.  
  38. typedef struct {
  39.         char name[9];
  40.         unsigned long crc;
  41.         } icon_struct;
  42.  
  43. icon_struct icon[ICON_MAX];
  44. int icon_total;
  45.  
  46. int opt_video;
  47. char opt_str[64];
  48. int opt_fname;
  49. int opt_sort;
  50.  
  51. int icon_nb_screen[3]={55,39,89};
  52. int icon_nb_width[3]={8,8,10};
  53. char icon_videomode[3]={0x12,0x10,0x54};
  54. char icon_videowidth[3]={80,80,100};
  55.  
  56. unsigned char vga_row=1;
  57. unsigned char vga_col=0;
  58.  
  59. char far *vga_font;
  60.  
  61. unsigned char palette_icon[17]={0x00,0x04,0x02,0x06,0x01,0x05,0x03,0x38
  62.                 ,0x07,0x24,0x12,0x36,0x09,0x2D,0x1B,0x3F,0x00};
  63.  
  64. unsigned char bufico[512];
  65.  
  66. int rowico=0;
  67.  
  68. int colico=0;
  69. int icon_nb=0;
  70.  
  71. unsigned char vgaplane[4]={0x01,0x02,0x04,0x08};
  72.  
  73. void vga_clrscr(int type)
  74. {
  75. unsigned int c,nb;
  76. int byte;
  77.   if (type==2)
  78.   {
  79.     nb=60000u;
  80.     for(c=0;c<4;c++)
  81.     {
  82.       disable();
  83.       outportb(*(unsigned far *)MK_FP(0xC000, 0x10), 0xB2);
  84.       byte = (inportb(*(unsigned far *)MK_FP(0xC000, 0x10) + 1) & 0xE1) | (c << 1);
  85.       outport(*(unsigned far *)MK_FP(0xC000, 0x10), (byte << 8) | 0xB2);
  86.       enable();
  87.       outportb(0x3C4,2);
  88.       outportb(0x3C5,vgaplane[c]);
  89.       setmem(MK_FP(0xA000,0),nb, 0xFF);
  90.     }
  91.   }
  92.   else
  93.   {
  94.     if (type==0) nb=38400u;
  95.     else nb=28000;
  96.     outportb( 0x3C4, 2 );
  97.     outportb( 0x3C5, 0x0F);
  98.     setmem(MK_FP(0xA000,0),nb, 0xFF);
  99.   }
  100. }
  101.  
  102. void vga_putico(void)
  103. {
  104. unsigned char ScreenByte;
  105. int i, j,m, k,c,r;
  106. unsigned int Offset, Bit,val;
  107. int byte;
  108.   rowico=((icon_nb/icon_nb_width[opt_video])*64)+16;
  109.   colico=(((icon_nb%icon_nb_width[opt_video]))*10)+5;
  110.   for(c=0;c<4;c++)
  111.   {
  112.     if (opt_video==2)
  113.     {
  114.       disable();
  115.       outportb(*(unsigned far *)MK_FP(0xC000, 0x10), 0xB2);
  116.       byte = (inportb(*(unsigned far *)MK_FP(0xC000, 0x10) + 1) & 0xE1) | (c << 1);
  117.       outport(*(unsigned far *)MK_FP(0xC000, 0x10), (byte << 8) | 0xB2);
  118.       enable();
  119.     }
  120.     outportb(0x3C4,2);
  121.     outportb(0x3C5,vgaplane[c]);
  122.     r=rowico;
  123.     k=511;
  124.     for(m=0;m<32;m++)
  125.     {
  126.       Offset = (r*icon_videowidth[opt_video])+colico;
  127.       for (i=0; i<4; i++)
  128.       {
  129.     ScreenByte=0;
  130.     Bit = 0x01;
  131.     for (j=0; j<4; j++)
  132.     {
  133.       val = (unsigned int)(bufico[k] & 0x0F);
  134.       if ((val&vgaplane[c]) != 0) ScreenByte |= Bit;
  135.       Bit <<= 1;
  136.       val = (unsigned int)(bufico[k] >> 4) & 0x0F;
  137.       if ((val&vgaplane[c]) != 0) ScreenByte |= Bit;
  138.       Bit <<= 1;
  139.       k--;
  140.     }
  141.     pokeb(0xA000,Offset--,ScreenByte);
  142.       }
  143.       r++;
  144.     }
  145.   }
  146. }
  147.  
  148. void palette_set(unsigned char *s)
  149. {
  150. struct SREGS sregs;
  151. union REGS regs;
  152.   regs.x.ax=0x1002;
  153.   regs.x.dx=FP_OFF(s);
  154.   sregs.es =FP_SEG(s);
  155.   int86x(0x10,®s,®s,&sregs);
  156. }
  157.  
  158. void vga_font_load(void)
  159. {
  160. struct REGPACK preg;
  161.   preg.r_ax=0x1130;
  162.   preg.r_bx=0x0300;
  163.   intr(0x10,&preg);
  164.   vga_font=MK_FP(preg.r_es,preg.r_bp);
  165. }
  166.  
  167. void vga_putchar(unsigned char buff)
  168. {
  169. int i;
  170. char far *base;
  171. char far *set;
  172. int byte,c=0x01;
  173.   if (opt_video==2)
  174.   {
  175.     disable();
  176.     outportb(*(unsigned far *)MK_FP(0xC000, 0x10), 0xB2);
  177.     byte = (inportb(*(unsigned far *)MK_FP(0xC000, 0x10) + 1) & 0xE1) | (c << 1);
  178.     outport(*(unsigned far *)MK_FP(0xC000, 0x10), (byte << 8) | 0xB2);
  179.     enable();
  180.   }
  181.   outportb(0x03C4,0x02);
  182.   outportb(0x03C5,0x0F);
  183.   base=MK_FP(0xA000,(vga_row*8*icon_videowidth[opt_video])+vga_col);
  184.   set=(char far *)(vga_font+(buff*8));
  185.   for ( i = 0; i <8; i++ )
  186.   {
  187.     *base=~*set;
  188.     base+=icon_videowidth[opt_video];
  189.     set++;
  190.   }
  191.   ++vga_col;
  192. }
  193.  
  194. void vga_putstr(char *st)
  195. {
  196. int i;
  197.   vga_col=1+((icon_nb%icon_nb_width[opt_video])*10);
  198.   vga_row=7+((icon_nb/icon_nb_width[opt_video])*8);
  199.   for(i=0;st[i]!=0;i++) vga_putchar(st[i]);
  200. }
  201.  
  202. void strcenter(char *s,int nb)
  203. {
  204. char st[100];
  205. int i,n;
  206.   n=(nb-strlen(s))/2;
  207.   for (i=0;i<n;i++) st[i]=' ';
  208.   st[i]=0;
  209.   strcat(st,s);
  210.   strcpy(s,st);
  211. }
  212.  
  213. int listico(char *fname)
  214. {
  215. int fp;
  216. char filename[64];
  217.   strcpy(filename,fname);
  218.   strcat(filename,".ICO");
  219.   fp=open(filename,O_RDONLY|O_BINARY);
  220.   lseek(fp,126L,SEEK_SET);
  221.   read(fp,bufico,512);
  222.   close(fp);
  223.   vga_putico();
  224.   if (opt_fname)
  225.   {
  226.     strcenter(fname,8);
  227.     vga_putstr(fname);
  228.   }
  229.   return(1);
  230. }
  231.  
  232. int get_screenmode(void)
  233. {
  234. union REGS regs;
  235.   regs.h.al = 0;
  236.   regs.h.ah = 15;
  237.   int86(0x10,®s,®s);
  238.   return(regs.h.al & 0x7f);
  239. }
  240.  
  241. void set_screenmode(int mode)
  242. {
  243. union REGS regs;
  244.   regs.h.al = mode;
  245.   regs.h.ah = 0;
  246.   int86(0x10,®s,®s);
  247. }
  248.  
  249. int dir_sort_long(const void *s1,const void *s2)
  250. {
  251.   if (((icon_struct *)s1)->crc==((icon_struct *)s2)->crc) return(0);
  252.   else if (((icon_struct *)s1)->crc>((icon_struct *)s2)->crc) return(1);
  253.   else return(-1);
  254. }
  255.  
  256. int dir_ico(void)
  257. {
  258. int done;
  259. struct ffblk ffblk;
  260.   icon_total=0;
  261.   if ((done=findfirst(opt_str,&ffblk,FA_ARCH))<0) return(0);
  262.   while (!done)
  263.   {
  264.     ffblk.ff_name[strlen(ffblk.ff_name)-4]=0;
  265.     icon[icon_total].crc=(long)icon_total;
  266.     strcpy(icon[icon_total++].name,ffblk.ff_name);
  267.     done = findnext(&ffblk);
  268.   }
  269.   qsort((char *)icon,icon_total,sizeof(icon_struct),strcmp);
  270.   return(1);
  271. }
  272.  
  273. static unsigned long crc_32_tab[] = {
  274. 0x00000000L,0x77073096L,0xEE0E612CL,0x990951BAL,0x076DC419L,0x706AF48FL,0xE963A535L,0x9E6495A3L,
  275. 0x0EDB8832L,0x79DCB8A4L,0xE0D5E91EL,0x97D2D988L,0x09B64C2BL,0x7EB17CBDL,0xE7B82D07L,0x90BF1D91L,
  276. 0x1DB71064L,0x6AB020F2L,0xF3B97148L,0x84BE41DEL,0x1ADAD47DL,0x6DDDE4EBL,0xF4D4B551L,0x83D385C7L,
  277. 0x136C9856L,0x646BA8C0L,0xFD62F97AL,0x8A65C9ECL,0x14015C4FL,0x63066CD9L,0xFA0F3D63L,0x8D080DF5L,
  278. 0x3B6E20C8L,0x4C69105EL,0xD56041E4L,0xA2677172L,0x3C03E4D1L,0x4B04D447L,0xD20D85FDL,0xA50AB56BL,
  279. 0x35B5A8FAL,0x42B2986CL,0xDBBBC9D6L,0xACBCF940L,0x32D86CE3L,0x45DF5C75L,0xDCD60DCFL,0xABD13D59L,
  280. 0x26D930ACL,0x51DE003AL,0xC8D75180L,0xBFD06116L,0x21B4F4B5L,0x56B3C423L,0xCFBA9599L,0xB8BDA50FL,
  281. 0x2802B89EL,0x5F058808L,0xC60CD9B2L,0xB10BE924L,0x2F6F7C87L,0x58684C11L,0xC1611DABL,0xB6662D3DL,
  282. 0x76DC4190L,0x01DB7106L,0x98D220BCL,0xEFD5102AL,0x71B18589L,0x06B6B51FL,0x9FBFE4A5L,0xE8B8D433L,
  283. 0x7807C9A2L,0x0F00F934L,0x9609A88EL,0xE10E9818L,0x7F6A0DBBL,0x086D3D2DL,0x91646C97L,0xE6635C01L,
  284. 0x6B6B51F4L,0x1C6C6162L,0x856530D8L,0xF262004EL,0x6C0695EDL,0x1B01A57BL,0x8208F4C1L,0xF50FC457L,
  285. 0x65B0D9C6L,0x12B7E950L,0x8BBEB8EAL,0xFCB9887CL,0x62DD1DDFL,0x15DA2D49L,0x8CD37CF3L,0xFBD44C65L,
  286. 0x4DB26158L,0x3AB551CEL,0xA3BC0074L,0xD4BB30E2L,0x4ADFA541L,0x3DD895D7L,0xA4D1C46DL,0xD3D6F4FBL,
  287. 0x4369E96AL,0x346ED9FCL,0xAD678846L,0xDA60B8D0L,0x44042D73L,0x33031DE5L,0xAA0A4C5FL,0xDD0D7CC9L,
  288. 0x5005713CL,0x270241AAL,0xBE0B1010L,0xC90C2086L,0x5768B525L,0x206F85B3L,0xB966D409L,0xCE61E49FL,
  289. 0x5EDEF90EL,0x29D9C998L,0xB0D09822L,0xC7D7A8B4L,0x59B33D17L,0x2EB40D81L,0xB7BD5C3BL,0xC0BA6CADL,
  290. 0xEDB88320L,0x9ABFB3B6L,0x03B6E20CL,0x74B1D29AL,0xEAD54739L,0x9DD277AFL,0x04DB2615L,0x73DC1683L,
  291. 0xE3630B12L,0x94643B84L,0x0D6D6A3EL,0x7A6A5AA8L,0xE40ECF0BL,0x9309FF9DL,0x0A00AE27L,0x7D079EB1L,
  292. 0xF00F9344L,0x8708A3D2L,0x1E01F268L,0x6906C2FEL,0xF762575DL,0x806567CBL,0x196C3671L,0x6E6B06E7L,
  293. 0xFED41B76L,0x89D32BE0L,0x10DA7A5AL,0x67DD4ACCL,0xF9B9DF6FL,0x8EBEEFF9L,0x17B7BE43L,0x60B08ED5L,
  294. 0xD6D6A3E8L,0xA1D1937EL,0x38D8C2C4L,0x4FDFF252L,0xD1BB67F1L,0xA6BC5767L,0x3FB506DDL,0x48B2364BL,
  295. 0xD80D2BDAL,0xAF0A1B4CL,0x36034AF6L,0x41047A60L,0xDF60EFC3L,0xA867DF55L,0x316E8EEFL,0x4669BE79L,
  296. 0xCB61B38CL,0xBC66831AL,0x256FD2A0L,0x5268E236L,0xCC0C7795L,0xBB0B4703L,0x220216B9L,0x5505262FL,
  297. 0xC5BA3BBEL,0xB2BD0B28L,0x2BB45A92L,0x5CB36A04L,0xC2D7FFA7L,0xB5D0CF31L,0x2CD99E8BL,0x5BDEAE1DL,
  298. 0x9B64C2B0L,0xEC63F226L,0x756AA39CL,0x026D930AL,0x9C0906A9L,0xEB0E363FL,0x72076785L,0x05005713L,
  299. 0x95BF4A82L,0xE2B87A14L,0x7BB12BAEL,0x0CB61B38L,0x92D28E9BL,0xE5D5BE0DL,0x7CDCEFB7L,0x0BDBDF21L,
  300. 0x86D3D2D4L,0xF1D4E242L,0x68DDB3F8L,0x1FDA836EL,0x81BE16CDL,0xF6B9265BL,0x6FB077E1L,0x18B74777L,
  301. 0x88085AE6L,0xFF0F6A70L,0x66063BCAL,0x11010B5CL,0x8F659EFFL,0xF862AE69L,0x616BFFD3L,0x166CCF45L,
  302. 0xA00AE278L,0xD70DD2EEL,0x4E048354L,0x3903B3C2L,0xA7672661L,0xD06016F7L,0x4969474DL,0x3E6E77DBL,
  303. 0xAED16A4AL,0xD9D65ADCL,0x40DF0B66L,0x37D83BF0L,0xA9BCAE53L,0xDEBB9EC5L,0x47B2CF7FL,0x30B5FFE9L,
  304. 0xBDBDF21CL,0xCABAC28AL,0x53B39330L,0x24B4A3A6L,0xBAD03605L,0xCDD70693L,0x54DE5729L,0x23D967BFL,
  305. 0xB3667A2EL,0xC4614AB8L,0x5D681B02L,0x2A6F2B94L,0xB40BBE37L,0xC30C8EA1L,0x5A05DF1BL,0x2D02EF8DL
  306. };
  307.  
  308. #define CRC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
  309.  
  310. unsigned long crc32file(char *fname)
  311. {
  312. FILE *fp;
  313. unsigned long crc32;
  314. unsigned long crc;
  315. int c;
  316.   crc=0L;
  317.   crc32 = 0xFFFFFFFFL;
  318.   if ((fp=fopen(fname, "rb"))!=NULL)
  319.   {
  320.     while ((c=getc(fp))!=EOF)
  321.     {
  322.       crc32 = CRC32(c, crc32);
  323.     }
  324.     fclose(fp);
  325.     crc = ~crc32;
  326.   }
  327.   return(crc);
  328. }
  329.  
  330. void dir_crc(void)
  331. {
  332. int i;
  333. char s[64];
  334.   for(i=0;i<icon_total;i++)
  335.   {
  336.     strcpy(s,icon[i].name);
  337.     strcat(s,".ICO");
  338.     icon[i].crc=crc32file(s);
  339.   }
  340. }
  341.  
  342. void dir_ico_dpy(void)
  343. {
  344. int i;
  345.   for(i=0;i<icon_total;i++)
  346.   {
  347.     printf("%-8s   %08lX",icon[i].name,icon[i].crc);
  348.     if ((opt_sort==2)&&(i!=0))
  349.     {
  350.       if (icon[i-1].crc==icon[i].crc) printf(" <---");
  351.     }
  352.     printf("\n");
  353.   }
  354.   printf("\n%d file(s) %ld bytes\n",icon_total,(long)icon_total*766L);
  355. }
  356.  
  357. /*--------------------------------------------------------------*/
  358.  
  359. void main(int argc,char *argv[])
  360. {
  361. int ch,i,lastmode=0;
  362.   opt_sort=0;
  363.   opt_fname=0;
  364.   opt_str[0]=0;
  365.   opt_video=0;
  366.   for (i=1;i<argc;i++)
  367.   {
  368.     if ((argv[i][0]=='/')||(argv[i][0]=='\\')||(argv[i][0]=='-'))
  369.     {
  370.       if (toupper(argv[i][1])=='E') opt_video=1;
  371.       else if (toupper(argv[i][1])=='S') opt_video=2;
  372.       else if (toupper(argv[i][1])=='F') opt_fname=1;
  373.       else if (toupper(argv[i][1])=='D') opt_sort=1;
  374.       else if (toupper(argv[i][1])=='C') opt_sort=2;
  375.       else
  376.       {
  377.     printf(" Usage: LISTICO [option] filename\n\n");
  378.     printf("Option:        /E .... EGA  640x350x16\n");
  379.     printf("        /S .... SVGA 800x600x16 (ATI Wonder only)\n");
  380.     printf("        /F .... Filename included\n");
  381.     printf("        /D .... Directory sort by Filename\n");
  382.     printf("        /C .... Directory sort by CRC value\n");
  383.     exit(0);
  384.       }
  385.     }
  386.     else if (opt_str[0]==0) strcpy(opt_str,argv[i]);
  387.   }
  388.   if (opt_str[0]==0) strcpy(opt_str,"*");
  389.   if (strchr(opt_str,'.')==NULL) strcat(opt_str,".ICO");
  390.   if (dir_ico()!=0)
  391.   {
  392.     if (opt_sort!=0)
  393.     {
  394.       dir_crc();
  395.       if (opt_sort==2) qsort((char *)icon,icon_total,sizeof(icon_struct),dir_sort_long);
  396.       dir_ico_dpy();
  397.     }
  398.     else
  399.     {
  400.       lastmode=get_screenmode();
  401.       set_screenmode(icon_videomode[opt_video]);
  402.       palette_set(palette_icon);
  403.       vga_clrscr(opt_video);
  404.       vga_font_load();
  405.       icon_nb=0;
  406.       ch=0;
  407.       for(i=0;i<icon_total;i++)
  408.       {
  409.     ch=0;
  410.     listico(icon[i].name);
  411.     icon_nb++;
  412.     if (icon_nb>icon_nb_screen[opt_video])
  413.     {
  414.       if ((ch=getch())==0x1B) break;
  415.       if (ch==' ')
  416.       {
  417.         i-=icon_nb_screen[opt_video];
  418.         i--;
  419.         if (opt_fname==0) opt_fname=1;
  420.         else opt_fname=0;
  421.       }
  422.       vga_clrscr(opt_video);
  423.       icon_nb=0;
  424.     }
  425.       }
  426.       if (ch==0) getch();
  427.       set_screenmode(lastmode);
  428.     }
  429.     printf("\nThank you for using LISTICO! - FREE program from Philippe Rabergeau - V 1.0\n");
  430.   }
  431.   else
  432.   {
  433.     printf("No WINDOWS 3.0 ICON File\n");
  434.   }
  435.   exit(0);
  436. }
  437.